﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CPTECH.Repository;
using CPTECH.Business;
using System.Collections;
using System.Runtime.InteropServices;
using OpenNETCF.Tapi;
using System.IO;


namespace CPTECH.Presentation
{
    public partial class frm_fisico : frm_default
    {
        string imei = "";
        int lastFicticio = 0;

        public frm_fisico()
        {
            InitializeComponent();

            imei = getIMEIInfo();
            checkFic();
            lastFicticio = getLastFic();
        }

        [DllImport("cellcore.dll")]
        internal static extern int lineGetGeneralInfo(IntPtr hLine, byte[] bCache);

        //volta para o form anterior
        private void mnu_voltar_Click(object sender, EventArgs e)
        {
            this.closeForm();//usa método heradado.
        }

        //chama o método que carrega as informações.
        private void frm_fisico_Load(object sender, EventArgs e)
        {
            callValues();
        }

        //carrega os campos já preenchidos.
        private void callValues()
        {
            string codFilial = "", codDepto = "", codCcusto = "", codPlanta = "";
            string codLocal = "";
            Int64 idBem = 0;

            idBem = FisicoDB.getInstance().getLastID();
            codFilial = FisicoBO.getInstance().codFilial;
            codDepto = FisicoBO.getInstance().codDepto;
            codCcusto = FisicoBO.getInstance().codCcusto;
            codPlanta = FisicoBO.getInstance().codPlanta;
            codLocal = FisicoBO.getInstance().codLocal;

            //preenche label de filial.
            if (codFilial == "")
            {
                lbl_filial.Text = "##";
            }
            else { lbl_filial.Text = codFilial.ToString(); }

            //preenche label de Local
            if (codLocal == "")
            {
                lbl_local.Text = "##";
            }
            else { lbl_local.Text = codLocal; }

            //preenche label de Departamento.
            if (codDepto == "")
            {
                lbl_departamento.Text = "##";
            }
            else { lbl_departamento.Text = codDepto.ToString(); }

            //preenche label de centro de Custo.
            if (codCcusto == "")
            {
                lbl_cCusto.Text = "##";
            }
            else { lbl_cCusto.Text = codCcusto.ToString(); }

            //preenche label de planta
            if (codPlanta == "")
            {
                lbl_planta.Text = "##";
            }
            else { lbl_planta.Text = codPlanta.ToString(); }

            //preenche txt de IDBem
            if (idBem == 0)
            {
                Int64 lastIDSeq = getLastIDseq();
                if (lastIDSeq == 0)
                {
                    TextWriter ls = new StreamWriter((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastID.txt"));
                    ls.WriteLine("1");
                    ls.Close();

                    txt_idBem.Text = "1";
                }
                else
                {
                    txt_idBem.Text = lastIDSeq.ToString();
                }
            }
            else
            {
                idBem++;
                txt_idBem.Text = idBem.ToString();
            }
            
        }

        //lê a etiqueta e veriifica seus dados.
        private void txt_plaqueta_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(System.Windows.Forms.Keys.Enter))
            {
                if (txt_plaqueta.Text == "")
                {
                    MessageBox.Show("Insira um número de serial para prosseguie!", "Aviso");
                    txt_plaqueta.Focus();
                }
                else
                {
                    txt_patAntigo.Focus();                    
                }
            }
        }

        //método que verifica se o item existe na base e retorna seus valores.
        private void getItemInformation()
        {
            if (txt_codItem.Text == "")
            {
                MessageBox.Show("Insira um código para continuar!", "Item");
                txt_codItem.Focus();
            }
            else
            {
                txt_codItem.Text = txt_codItem.Text.ToUpper().Trim();
                string codItem = txt_codItem.Text;
                try
                {
                    CodPad result = (CodPad)CodPadDB.getInstance().selectByCodPad(codItem)[0];

                    if (result == null)
                    {
                        txt_desItem.Text = "NÃO POSSUI";
                        txt_marca.Text = "NÃO POSSUI";
                        txt_modelo.Text = "NÃO POSSUI";
                    }
                    else
                    {
                        txt_desItem.Text = result.DS_PAD.ToString();
                        txt_marca.Text = result.MARCA.ToString();
                        txt_modelo.Text = result.MODELO.ToString();
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("Código de item não encontrado na base, verifique!", "Item não encontrado.");
                    txt_codItem.Focus();
                }
            }
        }

        //chama  o método que busca informações do item.
        private void bt_pesquisar_Click(object sender, EventArgs e)
        {
            getItemInformation();
        }
        
        //gera numeros ficticios de acordo com a quantidade.
        private ArrayList generateFicticio()
        {
            int quantidade = int.Parse(txt_quantidade.Text);
            ArrayList newFicticios = new ArrayList();

            for (int i = 0; i < quantidade; quantidade--)
            {
                lastFicticio++;
                newFicticios.Add("FIC" + imei + (lastFicticio.ToString())); 
            }
            updatelastFic(lastFicticio);
            return newFicticios;
        }

        // get IMEI code.
        public static string getIMEIInfo()
        {
            Line line;
            Tapi tapi;

            int ret = 0;

            tapi = new Tapi();
            tapi.Initialize();
            line = tapi.CreateLine(0, LINEMEDIAMODE.DATAMODEM,
            OpenNETCF.Tapi.LINECALLPRIVILEGE.OWNER |
            OpenNETCF.Tapi.LINECALLPRIVILEGE.MONITOR);

            LINEOPERATOR lop = new LINEOPERATOR();
            byte[] data = new byte[lop.SizeOf];
            ret = CellTSP.lineGetCurrentOperator(line.hLine, data);
            ByteCopy.ByteArrayToStruct(data, lop);
            OpenNETCF.Tapi.LINEGENERALINFO lgi =
                   new OpenNETCF.Tapi.LINEGENERALINFO(1024);
            lgi.Store();
            ret = CellTSP.lineGetGeneralInfo(line.hLine, lgi.Data);
            lgi.Load();

            return lgi.SerialNumber.Substring(0, 15);
        }

        //pega numero do ultimo ficticio gerado.
        private int getLastFic()
        {
            int last = 0;
            StreamReader sr = new StreamReader((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastFic.txt"));
            while (!sr.EndOfStream)
            {
                last = int.Parse(sr.ReadLine());
            }
            sr.Close();
            return last; 
        }

        //verifica se arquivo existe.
        private void checkFic()
        {
            if (!File.Exists(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastFic.txt"))
            {
                TextWriter fic = new StreamWriter((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastFic.txt"));
                fic.WriteLine("0");
                fic.Close();
            } 
        }

        //atualiza o ultimo ficticio gerado.
        private void updatelastFic(int lastFic)
        {
            TextWriter fic = new StreamWriter((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastFic.txt"));
            fic.WriteLine(lastFic);
            fic.Close();
        }

        //chama o método que valida, grava os campos e vai pro proximo form.
        private void mnu_prosseguir_Click(object sender, EventArgs e)
        {
            checkCampos();
        }

        //método que valida os campos obrigatórios e gera ficticio se preciso.
        private void checkCampos()
        {
            if (txt_desItem.Text == "")
            {
                MessageBox.Show("Adicione uma descrição de item para continuar!", "Item");
                txt_codItem.Focus();
            }

            else if (cb_padrao.SelectedItem == null)
            {
                MessageBox.Show("Selecione um padrão para continuar!", "Padrão");
            }

            else if (txt_plaqueta.Text == "")
            {
                var resultado = MessageBox.Show("Nenhuma plaqueta lida, deseja gerar Fictício?", "Fictício", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                if (resultado == DialogResult.Yes)
                {
                    FisicoBO.getInstance().ficticios = generateFicticio();
                    saveValues();

                    frm_fisico2 fisico2 = new frm_fisico2(this);//cria instancia do form novo
                    fisico2.showForm(this);//chama o form gerado.
                }
                else
                {
                    txt_plaqueta.Focus();
                }
            }
            else
            {
                saveValues();
                frm_fisico2 fisico2 = new frm_fisico2(this);//cria instancia do form novo
                fisico2.showForm(this);//chama o form gerado.         
            }
        }

        //salva os campos
        private void saveValues()
        {
            FisicoBO.getInstance().idBem = Int64.Parse(txt_idBem.Text);
            FisicoBO.getInstance().plaqueta = txt_plaqueta.Text;
            FisicoBO.getInstance().patAntigo = txt_patAntigo.Text;
            FisicoBO.getInstance().codItem = txt_codItem.Text;
            FisicoBO.getInstance().dsItem = txt_desItem.Text;
            FisicoBO.getInstance().marca = txt_marca.Text;
            FisicoBO.getInstance().modelo = txt_modelo.Text;
            FisicoBO.getInstance().padrao = cb_padrao.SelectedItem.ToString();
        }

        //permite apenas inserção de npumeros neste campo.
        private void txt_quantidade_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
                MessageBox.Show("Somente números são permitidos neste campo!", "Aviso");
                txt_quantidade.Text = "";
                txt_quantidade.Focus();
            }
        }

        //método será chamado pelo Form frm_fisico1, após salvar os item.
        //ele limpa os campos referente ao item anteiror e recarrega o idBem atual.
        public void recarregar()
        {
            txt_plaqueta.Text = "";
            txt_quantidade.Text = "1";
            txt_patAntigo.Text = "";
            txt_codItem.Text = "";
            txt_desItem.Text = "";
            txt_marca.Text = "";
            txt_modelo.Text = "";
            txt_plaqueta.Focus();

            Int64 idBem = FisicoDB.getInstance().getLastID();
            idBem++;
            //preenche txt de IDBem
            txt_idBem.Text = "";
            txt_idBem.Text = idBem.ToString();

        }

        //pega numero do ultimo ID gerado.
        private Int64 getLastIDseq()    
        {
            Int64 last = 0;
            if (!File.Exists((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastID.txt")))
            {
                //File.Create((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastID.txt"));
                return last;
                
            }
            else
            {
                StreamReader sr = new StreamReader((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastID.txt"));
                while (!sr.EndOfStream)
                {
                    last = Int64.Parse(sr.ReadLine());
                }
                sr.Close();
                last++;
                return last;
            }
        }

        //limpa as variaveis e volta para o formulário de menu.
        private void mnu_finalizar_Click(object sender, EventArgs e)
        {
            FisicoBO.getInstance().clearCampos();
            this.closeAllBackMenu("frm_menu");//usa o metodo herdado pra fechar todas as telas e voltar para o menu.
        }

    }
}